// https://blog.csdn.net/weixin_33966095/article/details/94504276

#include "iostream"
#include "vector"
using namespace std;

int check(int num){
    return (num&(num<<1))||(num&(num>>1));//有相邻的则返回真
}
int check2(int line1,int line2){
    return line1&line2;
}


int main(char argc,char *args[]){
    int row=2,col=3;
    int dp[row+1][1<<col];
    int f[3][3]={{0,0,0},{1,1,1},{0,1,0}};
    int temp=0;
    
// vector<vector<int> > visited(row,vector<int>(column,6));//初始化一个 二维vector 行row,列column ,且 值为data=6 自定义data;
    for(int i=0;i<3;i++){
        for(int j=0;j<(1<<col);j++){
            dp[i][j] = 0;
            cout<<dp[i][j]<<"  ";
        }
        cout<<endl;
    }

    for(int i=1;i<=row;i++){  //行号
        temp = 0;
        for(int t=0;t<col;t++){
            temp|=f[i][t]<<t;
        }
        cout<<"temp ="<<temp<<endl;

        for(int j=0;j<(1<<col);j++){

            if(!check(j) && !(j&(~temp))){//没有相邻的  
                if(i==1){//第一行
                    dp[i][j]++;
                }
                else{
                    for(int k=0;k<(1<<col);k++){ //判断上一行
                        if(dp[i-1][k]==0)
                            continue;
                        if(!check2(j,k)){//如果不冲突
                        cout<<"j  k  "<<j<<k<<endl;
                            dp[i][j]++;  //这一行的方案数 加上 上一行的方案数
                        }
                    }
                }
            }
            else
                continue;
        }
    }
    cout<<endl;
    for(int i=0;i<3;i++){
        for(int j=0;j<(1<<col);j++){
            cout<<dp[i][j]<<"  ";
        }
        cout<<endl;
    }
    return 0;
}